gtk_widget_init_template (GTK_WIDGET (win));
list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (list);
+ list = gtk_content_formats_add_text_targets (list);
gtk_icon_view_enable_model_drag_source (GTK_ICON_VIEW (win->list),
GDK_BUTTON1_MASK,
list,
gdk_content_formats_unref
gdk_content_formats_print
gdk_content_formats_to_string
-gdk_content_formats_add
gdk_content_formats_union
gdk_content_formats_intersects
gdk_content_formats_remove
return g_string_free (string, FALSE);
}
-/**
- * gdk_content_formats_add:
- * @formats: a #GdkContentFormats
- * @mime_type: the mime type to add
- *
- * Appends another mime_type to a #GdkContentFormats.
- **/
-void
-gdk_content_formats_add (GdkContentFormats *formats,
- const char *mime_type)
-{
- g_return_if_fail (formats != NULL);
-
- formats->formats = g_list_append (formats->formats, (gpointer) gdk_atom_intern (mime_type, FALSE));
-}
-
/**
* gdk_content_formats_union:
- * @first: the #GdkContentFormats to merge into
- * @second: the #GtkTargeList to merge from
+ * @first: (transfer full): the #GdkContentFormats to merge into
+ * @second: (transfer none): the #GdkContentFormats to merge from
*
* Append all missing types from @second to @first, in the order
* they had in @second.
+ *
+ * Returns: a new #GdkContentFormats
*/
-void
+GdkContentFormats *
gdk_content_formats_union (GdkContentFormats *first,
const GdkContentFormats *second)
{
- GList *l;
+ GdkContentFormatsBuilder *builder;
- g_return_if_fail (first != NULL);
- g_return_if_fail (second != NULL);
+ g_return_val_if_fail (first != NULL, NULL);
+ g_return_val_if_fail (second != NULL, NULL);
- for (l = second->formats; l; l = l->next)
- {
- first->formats = g_list_append (first->formats, l->data);
- }
+ builder = gdk_content_formats_builder_new ();
+
+ gdk_content_formats_builder_add_formats (builder, first);
+ gdk_content_formats_unref (first);
+ gdk_content_formats_builder_add_formats (builder, second);
+
+ return gdk_content_formats_builder_free (builder);
}
/**
**/
void
gdk_content_formats_builder_add_formats (GdkContentFormatsBuilder *builder,
- GdkContentFormats *formats)
+ const GdkContentFormats *formats)
{
GList *l;
char * gdk_content_formats_to_string (GdkContentFormats *formats);
GDK_AVAILABLE_IN_3_94
-void gdk_content_formats_union (GdkContentFormats *first,
- const GdkContentFormats *second);
+GdkContentFormats * gdk_content_formats_union (GdkContentFormats *first,
+ const GdkContentFormats *second) G_GNUC_WARN_UNUSED_RESULT;
GDK_AVAILABLE_IN_3_94
GdkAtom gdk_content_formats_intersects (const GdkContentFormats *first,
const GdkContentFormats *second);
GDK_AVAILABLE_IN_3_94
-void gdk_content_formats_add (GdkContentFormats *formats,
- const char *mime_type);
-GDK_AVAILABLE_IN_3_94
gboolean gdk_content_formats_contains (const GdkContentFormats *formats,
const char *mime_type);
GdkContentFormats * gdk_content_formats_builder_free (GdkContentFormatsBuilder *builder) G_GNUC_WARN_UNUSED_RESULT;
GDK_AVAILABLE_IN_3_94
void gdk_content_formats_builder_add_formats (GdkContentFormatsBuilder *builder,
- GdkContentFormats *formats);
+ const GdkContentFormats *formats);
GDK_AVAILABLE_IN_3_94
void gdk_content_formats_builder_add_mime_type(GdkContentFormatsBuilder *builder,
const char *mime_type);
const char *type)
{
GdkWaylandSelection *selection = data;
+ GdkContentFormatsBuilder *builder;
DataOfferData *info;
info = g_hash_table_lookup (selection->offers, wl_data_offer);
GDK_NOTE (EVENTS,
g_message ("data offer offer, offer %p, type = %s", wl_data_offer, type));
- gdk_content_formats_add (info->targets, type);
+ builder = gdk_content_formats_builder_new ();
+ gdk_content_formats_builder_add_formats (builder, info->targets);
+ gdk_content_formats_builder_add_mime_type (builder, type);
+ gdk_content_formats_unref (info->targets);
+ info->targets = gdk_content_formats_builder_free (builder);
}
static inline GdkDragAction
const char *type)
{
GdkWaylandSelection *selection = data;
+ GdkContentFormatsBuilder *builder;
DataOfferData *info;
info = g_hash_table_lookup (selection->offers, gtk_offer);
GDK_NOTE (EVENTS,
g_message ("primary offer offer, offer %p, type = %s", gtk_offer, type));
- gdk_content_formats_add (info->targets, type);
+ builder = gdk_content_formats_builder_new ();
+ gdk_content_formats_builder_add_formats (builder, info->targets);
+ gdk_content_formats_builder_add_mime_type (builder, type);
+ gdk_content_formats_unref (info->targets);
+ info->targets = gdk_content_formats_builder_free (builder);
}
static const struct gtk_primary_selection_offer_listener primary_offer_listener = {
{
GdkDragContext *context;
GdkContentFormats *target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
context = gtk_drag_begin_with_coordinates (widget, target_list, GDK_ACTION_COPY,
1, (GdkEvent *)event,
priv->drag_start_x, priv->drag_start_y);
g_return_if_fail (text != NULL);
formats = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (formats);
+ formats = gtk_content_formats_add_text_targets (formats);
if (len < 0)
len = strlen (text);
g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
formats = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_image_targets (formats, TRUE);
+ formats = gtk_content_formats_add_image_targets (formats, TRUE);
gtk_clipboard_set_with_data (clipboard,
formats,
gdk_content_formats_ref (target_list);
else
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
gtk_drag_dest_set_target_list (widget, target_list);
gdk_content_formats_unref (target_list);
}
gdk_content_formats_ref (target_list);
else
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_image_targets (target_list, FALSE);
+ target_list = gtk_content_formats_add_image_targets (target_list, FALSE);
gtk_drag_dest_set_target_list (widget, target_list);
gdk_content_formats_unref (target_list);
}
gdk_content_formats_ref (target_list);
else
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_uri_targets (target_list);
+ target_list = gtk_content_formats_add_uri_targets (target_list);
gtk_drag_dest_set_target_list (widget, target_list);
gdk_content_formats_unref (target_list);
}
gdk_content_formats_ref (target_list);
else
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
gtk_drag_source_set_target_list (widget, target_list);
gdk_content_formats_unref (target_list);
}
gdk_content_formats_ref (target_list);
else
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_image_targets (target_list, TRUE);
+ target_list = gtk_content_formats_add_image_targets (target_list, TRUE);
gtk_drag_source_set_target_list (widget, target_list);
gdk_content_formats_unref (target_list);
}
gdk_content_formats_ref (target_list);
else
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_uri_targets (target_list);
+ target_list = gtk_content_formats_add_uri_targets (target_list);
gtk_drag_source_set_target_list (widget, target_list);
gdk_content_formats_unref (target_list);
}
guint actions = priv->editable ? GDK_ACTION_COPY | GDK_ACTION_MOVE : GDK_ACTION_COPY;
guint button;
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
gtk_entry_get_pixel_ranges (entry, &ranges, &n_ranges);
return;
list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (list);
+ list = gtk_content_formats_add_text_targets (list);
clipboard = gtk_widget_get_clipboard (GTK_WIDGET (entry), GDK_SELECTION_PRIMARY);
/* DnD */
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_uri_targets (target_list);
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_uri_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
gtk_drag_dest_set (GTK_WIDGET (button),
(GTK_DEST_DEFAULT_ALL),
target_list,
clipboard = gtk_widget_get_clipboard (GTK_WIDGET (impl), GDK_SELECTION_CLIPBOARD);
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (target_list);
- gtk_content_formats_add_uri_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_uri_targets (target_list);
gtk_clipboard_set_with_data (clipboard, target_list,
copy_file_get_cb,
const GdkEvent *event;
event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
g_signal_connect (widget, "drag-begin",
G_CALLBACK (drag_begin_cb), NULL);
GdkContentFormats *list;
list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (list);
+ list = gtk_content_formats_add_text_targets (list);
if (clipboard)
gtk_clipboard_set_with_owner (clipboard,
NULL,
GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK);
target_list = gdk_content_formats_new (dnd_drop_targets, G_N_ELEMENTS (dnd_drop_targets));
- gtk_content_formats_add_uri_targets (target_list);
+ target_list = gtk_content_formats_add_uri_targets (target_list);
gtk_drag_dest_set_target_list (sidebar->list_box, target_list);
gdk_content_formats_unref (target_list);
sidebar->source_targets = gdk_content_formats_new (dnd_source_targets, G_N_ELEMENTS (dnd_source_targets));
- gtk_content_formats_add_text_targets (sidebar->source_targets);
+ sidebar->source_targets = gtk_content_formats_add_text_targets (sidebar->source_targets);
g_signal_connect (sidebar->list_box, "motion-notify-event",
G_CALLBACK (on_motion_notify_event), sidebar);
*
* Since: 2.6
**/
-void
+GdkContentFormats *
gtk_content_formats_add_text_targets (GdkContentFormats *list)
{
- g_return_if_fail (list != NULL);
+ GdkContentFormatsBuilder *builder;
+
+ g_return_val_if_fail (list != NULL, NULL);
init_atoms ();
+ builder = gdk_content_formats_builder_new ();
+ gdk_content_formats_builder_add_formats (builder, list);
+ gdk_content_formats_unref (list);
+
/* Keep in sync with gtk_selection_data_targets_include_text()
*/
- gdk_content_formats_add (list, utf8_atom);
- gdk_content_formats_add (list, ctext_atom);
- gdk_content_formats_add (list, text_atom);
- gdk_content_formats_add (list, GDK_TARGET_STRING);
- gdk_content_formats_add (list, text_plain_utf8_atom);
+ gdk_content_formats_builder_add_mime_type (builder, utf8_atom);
+ gdk_content_formats_builder_add_mime_type (builder, ctext_atom);
+ gdk_content_formats_builder_add_mime_type (builder, text_atom);
+ gdk_content_formats_builder_add_mime_type (builder, GDK_TARGET_STRING);
+ gdk_content_formats_builder_add_mime_type (builder, text_plain_utf8_atom);
if (!g_get_charset (NULL))
- gdk_content_formats_add (list, text_plain_locale_atom);
- gdk_content_formats_add (list, text_plain_atom);
+ gdk_content_formats_builder_add_mime_type (builder, text_plain_locale_atom);
+ gdk_content_formats_builder_add_mime_type (builder, text_plain_atom);
+
+ return gdk_content_formats_builder_free (builder);
}
/**
*
* Since: 2.10
**/
-void
+GdkContentFormats *
gtk_content_formats_add_rich_text_targets (GdkContentFormats *list,
gboolean deserializable,
GtkTextBuffer *buffer)
{
+ GdkContentFormatsBuilder *builder;
GdkAtom *atoms;
gint n_atoms;
gint i;
- g_return_if_fail (list != NULL);
- g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
+ g_return_val_if_fail (list != NULL, NULL);
+ g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL);
+
+ builder = gdk_content_formats_builder_new ();
+ gdk_content_formats_builder_add_formats (builder, list);
+ gdk_content_formats_unref (list);
if (deserializable)
atoms = gtk_text_buffer_get_deserialize_formats (buffer, &n_atoms);
atoms = gtk_text_buffer_get_serialize_formats (buffer, &n_atoms);
for (i = 0; i < n_atoms; i++)
- gdk_content_formats_add (list, atoms[i]);
+ gdk_content_formats_builder_add_mime_type (builder, atoms[i]);
g_free (atoms);
+
+ return gdk_content_formats_builder_free (builder);
}
/**
*
* Since: 2.6
**/
-void
+GdkContentFormats *
gtk_content_formats_add_image_targets (GdkContentFormats *list,
gboolean writable)
{
+ GdkContentFormatsBuilder *builder;
GSList *formats, *f;
gchar **mimes, **m;
- g_return_if_fail (list != NULL);
+ g_return_val_if_fail (list != NULL, NULL);
+
+ builder = gdk_content_formats_builder_new ();
+ gdk_content_formats_builder_add_formats (builder, list);
+ gdk_content_formats_unref (list);
formats = gdk_pixbuf_get_formats ();
mimes = gdk_pixbuf_format_get_mime_types (fmt);
for (m = mimes; *m; m++)
{
- gdk_content_formats_add (list, *m);
+ gdk_content_formats_builder_add_mime_type (builder, *m);
}
g_strfreev (mimes);
}
g_slist_free (formats);
+
+ return gdk_content_formats_builder_free (builder);
}
/**
*
* Since: 2.6
**/
-void
+GdkContentFormats *
gtk_content_formats_add_uri_targets (GdkContentFormats *list)
{
- g_return_if_fail (list != NULL);
+ GdkContentFormatsBuilder *builder;
+
+ g_return_val_if_fail (list != NULL, NULL);
init_atoms ();
- gdk_content_formats_add (list, text_uri_list_atom);
+ builder = gdk_content_formats_builder_new ();
+ gdk_content_formats_builder_add_formats (builder, list);
+ gdk_content_formats_unref (list);
+
+ gdk_content_formats_builder_add_mime_type (builder, text_uri_list_atom);
+
+ return gdk_content_formats_builder_free (builder);
}
/**
return sellist->list;
}
+static void
+gtk_selection_target_list_add (GtkWidget *widget,
+ GdkAtom selection,
+ GdkContentFormats *formats)
+{
+ GtkSelectionTargetList *sellist;
+ GList *tmp_list;
+ GList *lists;
+
+ lists = g_object_get_data (G_OBJECT (widget), gtk_selection_handler_key);
+
+ tmp_list = lists;
+ while (tmp_list)
+ {
+ sellist = tmp_list->data;
+ if (sellist->selection == selection)
+ {
+ sellist->list = gdk_content_formats_union (sellist->list, formats);
+ return;
+ }
+ tmp_list = tmp_list->next;
+ }
+
+ if (tmp_list == NULL)
+ {
+ sellist = g_slice_new (GtkSelectionTargetList);
+ sellist->selection = selection;
+ sellist->list = gdk_content_formats_ref (formats);
+ }
+
+ lists = g_list_prepend (lists, sellist);
+ g_object_set_data (G_OBJECT (widget), I_(gtk_selection_handler_key), lists);
+}
+
static void
gtk_selection_target_list_remove (GtkWidget *widget)
{
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (selection != NULL);
- list = gtk_selection_target_list_get (widget, selection);
- gdk_content_formats_add (list, target);
- gdk_selection_add_targets (gtk_widget_get_window (widget), selection, &target, 1);
+ list = gdk_content_formats_new (&target, 1);
+ gtk_selection_add_targets (widget, selection, list);
+ gdk_content_formats_unref (list);
}
/**
* for a given widget and selection.
**/
void
-gtk_selection_add_targets (GtkWidget *widget,
- GdkAtom selection,
+gtk_selection_add_targets (GtkWidget *widget,
+ GdkAtom selection,
GdkContentFormats *targets)
{
- GdkContentFormats *list;
GdkAtom *atoms;
guint n_targets;
g_return_if_fail (selection != NULL);
g_return_if_fail (targets != NULL);
- list = gtk_selection_target_list_get (widget, selection);
- gdk_content_formats_union (list, targets);
+ gtk_selection_target_list_add (widget, selection, targets);
atoms = gdk_content_formats_get_atoms (targets, &n_targets);
gdk_selection_add_targets (gtk_widget_get_window (widget), selection, atoms, n_targets);
g_return_val_if_fail (targets != NULL || n_targets == 0, FALSE);
list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_image_targets (list, writable);
+ list = gtk_content_formats_add_image_targets (list, writable);
for (i = 0; i < n_targets && !result; i++)
{
if (gdk_content_formats_contains (list, targets[i]))
#define GTK_TYPE_SELECTION_DATA (gtk_selection_data_get_type ())
GDK_AVAILABLE_IN_ALL
-void gtk_content_formats_add_text_targets (GdkContentFormats *list);
+GdkContentFormats * gtk_content_formats_add_text_targets (GdkContentFormats *list) G_GNUC_WARN_UNUSED_RESULT;
GDK_AVAILABLE_IN_ALL
-void gtk_content_formats_add_rich_text_targets (GdkContentFormats *list,
- gboolean deserializable,
- GtkTextBuffer *buffer);
+GdkContentFormats * gtk_content_formats_add_rich_text_targets (GdkContentFormats *list,
+ gboolean deserializable,
+ GtkTextBuffer *buffer) G_GNUC_WARN_UNUSED_RESULT;
GDK_AVAILABLE_IN_ALL
-void gtk_content_formats_add_image_targets (GdkContentFormats *list,
- gboolean writable);
+GdkContentFormats * gtk_content_formats_add_image_targets (GdkContentFormats *list,
+ gboolean writable) G_GNUC_WARN_UNUSED_RESULT;
GDK_AVAILABLE_IN_ALL
-void gtk_content_formats_add_uri_targets (GdkContentFormats *list);
+GdkContentFormats * gtk_content_formats_add_uri_targets (GdkContentFormats *list) G_GNUC_WARN_UNUSED_RESULT;
GDK_AVAILABLE_IN_ALL
gboolean gtk_selection_owner_set (GtkWidget *widget,
{
GdkContentFormats *target_list;
- target_list = gdk_content_formats_new (NULL, 0);
if (include_local)
- gdk_content_formats_add (target_list,
- gdk_atom_intern_static_string ("GTK_TEXT_BUFFER_CONTENTS"));
+ target_list = gdk_content_formats_new ((const char *[2]) {
+ "GTK_TEXT_BUFFER_CONTENTS",
+ NULL
+ }, 1);
+ else
+ target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_rich_text_targets (target_list,
- deserializable,
- buffer);
+ target_list = gtk_content_formats_add_rich_text_targets (target_list,
+ deserializable,
+ buffer);
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
return target_list;
}
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_image_targets (target_list, FALSE);
+ target_list = gtk_content_formats_add_image_targets (target_list, FALSE);
if (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME)
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_text_targets (target_list);
gtk_drag_source_set_target_list (image, target_list);
target_list = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_image_targets (target_list, FALSE);
- gtk_content_formats_add_text_targets (target_list);
+ target_list = gtk_content_formats_add_image_targets (target_list, FALSE);
+ target_list = gtk_content_formats_add_text_targets (target_list);
gtk_drag_dest_set_target_list (image, target_list);
GTK_ENTRY_ICON_PRIMARY,
"Save a file");
tlist = gdk_content_formats_new (NULL, 0);
- gtk_content_formats_add_text_targets (tlist);
+ tlist = gtk_content_formats_add_text_targets (tlist);
gtk_entry_set_icon_drag_source (GTK_ENTRY (entry),
GTK_ENTRY_ICON_PRIMARY,
tlist, GDK_ACTION_COPY);